package cn.luckdou.commons.pay.alipay.util;

import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradeAppPayModel;
import com.alipay.api.request.AlipayTradeAppPayRequest;
import com.alipay.api.request.AlipayTradeQueryRequest;
import com.alipay.api.request.AlipayTradeRefundRequest;
import com.alipay.api.response.AlipayTradeAppPayResponse;
import com.alipay.api.response.AlipayTradeQueryResponse;
import com.alipay.api.response.AlipayTradeRefundResponse;
import cn.luckdou.commons.pay.alipay.config.AlipayConfig;

/**
 * <p> Title: AlipayUtils.java<／p>
 * <p> Description: 支付宝工具类<／p>  <p>
 * Copyright: Copyright (c) 20017<／p> <p>
 * @author Dadou
 * @date 2017年7月13日 上午11:11:25
 */
public class AlipayUtils {
	
	/**
	 * <p> Title: alipay_trade_query </p> 
	 * <p> Description: 交易查询接口alipay.trade.query </p>
	 * @author Dadou
	 * @DateTime 2017年7月13日 上午11:17:00
	 * @param out_trade_no 支付时传入的商户订单号，与trade_no必填一个
	 * @param trade_no  支付时返回的支付宝交易号，与out_trade_no必填一个
	 * @return
	 */
	public static String alipay_trade_query(String out_trade_no, String trade_no) {
		AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do",
				AlipayConfig.partner, AlipayConfig.private_key, "json", AlipayConfig.input_charset,
				AlipayConfig.ali_public_key, "RSA2"); // 获得初始化的AlipayClient
		AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();// 创建API对应的request类
		request.setBizContent(
				"{" + "\"out_trade_no\":\"" + out_trade_no + "\"," + "   \"trade_no\":\"" + trade_no + "\"" + "  }");// 设置业务参数
		try {
			AlipayTradeQueryResponse response = alipayClient.execute(request);// 通过alipayClient调用API，获得对应的response类
			String body = response.getBody();
			return body;
		} catch (AlipayApiException e) {
			e.printStackTrace();
			return e.getErrMsg();
		}

	}
	
	/**
	 * 
	 * <p>Title: alipay_trade_pay</p>
	 * <p>Description: 交易下单 alipay_trade_pay </p>
	 *  @author Dadou
	 *  @DateTime 2017年7月13日 上午11:33:46
	 *  @param out_trade_no 商户订单号必填
	 *  @param total_amount 金额,单位人民币 元
	 *  @return
	 *  @throws Exception
	 */
	public static String alipay_trade_pay(String out_trade_no, String total_amount) throws Exception {
		// 实例化客户端
		AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do",
				AlipayConfig.partner, AlipayConfig.private_key, "json", AlipayConfig.input_charset,
				AlipayConfig.ali_public_key, "RSA2");
		// 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称：alipay.trade.app.pay
		AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
		// SDK已经封装掉了公共参数，这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
		AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
		model.setBody("partylive 充值金币");
		model.setSubject("partylive 充值金币" + total_amount);
		model.setOutTradeNo(out_trade_no);
		model.setTimeoutExpress("30m");
		model.setTotalAmount(total_amount);
		model.setProductCode("QUICK_MSECURITY_PAY");
		request.setBizModel(model);
		request.setNotifyUrl("http://admin.partylive.cn/appwxpay/notify_url");
		try {
			// 这里和普通的接口调用不同，使用的是sdkExecute
			AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
			String encode = response.getBody();// 就是orderString
												// 可以直接给客户端请求，无需再做处理。
			return encode;
		} catch (AlipayApiException e) {
			e.printStackTrace();
			return e.getErrMsg();
		}
	}
	
	/**
	 * 
	 * <p>Title: alipay_trade_refund</p>
	 * <p>Description: 交易退款接口  alipay.trade.refund</p>
	 *  @author Dadou
	 *  @DateTime 2017年7月13日 上午11:34:40
	 *  @param out_trade_no 支付时传入的商户订单号，与trade_no必填一个
	 *  @param trade_no 支付时返回的支付宝交易号，与out_trade_no必填一个
	 *  @param out_request_no 本次退款请求流水号，部分退款时必传
	 *  @param refund_amount 本次退款请求流水号，部分退款时必传
	 *  @return
	 *  @throws Exception
	 */
	public static String alipay_trade_refund(String out_trade_no, String trade_no, String out_request_no, String refund_amount)
			throws Exception {
		AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do",
				AlipayConfig.partner, AlipayConfig.private_key, "json", AlipayConfig.input_charset,
				AlipayConfig.ali_public_key, "RSA2");// 获得初始化的AlipayClient
		AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();// 创建API对应的request类
		request.setBizContent("{" + "    \"out_trade_no\":\""+out_trade_no+"\","
				+ "    \"trade_no\":\""+trade_no+"\"," + "    \"out_request_no\":\""+out_request_no+"\","
				+ "    \"refund_amount\":\""+refund_amount+"\"" + "  }");// 设置业务参数
		try {
			AlipayTradeRefundResponse response = alipayClient.execute(request);// 通过alipayClient调用API，获得对应的response类
			// 根据response中的结果继续业务逻辑处理
			String encode = response.getBody();// 就是orderString
												// 可以直接给客户端请求，无需再做处理。
			return encode;
		} catch (AlipayApiException e) {
			e.printStackTrace();
			return e.getErrMsg();
		}
	}
}
